package tech.aistar.day13;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * 本类用来演示: 反射操作属性
 *
 * @author: success
 * @date: 2022/8/4 10:10 上午
 */
public class FieldDemo {
    public static void main(String[] args) {
        //1. 获取class实例
        Class<?> c = Point.class;

        //2. 获取Point类中的实例
       // Field[] fields = c.getFields();//除了私有属性

        Field[] fields = c.getDeclaredFields();//所有的(包括私有的)
        for (Field f : fields) {
            //System.out.println(f);//public java.lang.String tech.aistar.day13.Point.x

            //单独去获取属性的信息
            //1. 获取修饰符
            // public - 1
            // private -2
            // 默认的是 - 0
            // protected - 4
            int mod = f.getModifiers();
            System.out.print(Modifier.toString(mod)+" ");

            //2. 获取数据类型 - Class
            Class<?> dataType = f.getType();
            System.out.print(dataType.getSimpleName()+" ");

            //3. 获取属性的名称
            String fieldName = f.getName();
            System.out.println(fieldName);
        }

        System.out.println("========");

        //根据属性的名称来获取指定的属性对应的Field对象
        try {
            Point point = new Point();

            Field xField = c.getDeclaredField("x"); // 公开属性

            //反射设置属性的值 - 通过反射方式来设置属性值
            xField.set(point,"admin");

            //反射操作私有的属性
            Field yField = c.getDeclaredField("y");
            //需要强制将私有的属性设置成可见的
            yField.setAccessible(true);

            yField.set(point,100);

            System.out.println(point);

        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {//非法访问
            e.printStackTrace();
        }
    }
}
